package com.szrt.day20170418.ch05;

public class PetDaoImpl implements  PetDao {
	
	
	/**
	 * 根据条件修改宠物 返回修改后的宠物数组  8000
	 * @param huayun        宠物商店
	 * @param conditions    条件  根据 颜色 名字 年龄的排列组合
	 * @param after         修改后的值
	 * @return
	 */
	@Override
	public Pet[] updatePetByConditions(PetShop huayun,Pet conditions, Pet after){
		
		
		
		//1 确定新数组的长度
		//拿到所有的条件  (颜色 性别 姓名)  如果不为null 3次循环  优化 反射去做
		String name  = conditions.getName();
		String color = conditions.getColor();
		int    age   = conditions.getAge();
		
		//要查找的范围 所有的宠物
		Pet[] pets = huayun.getPets();
		
		
		int counter =0;
		
		
		//名字没有传
		if(name == null){
			//名字为null
			for(Pet pet: pets){
				if(pet != null){
					counter = checkColorAndAge(color, age, counter, pet);
					System.out.println("counter="+counter);
				}
			}
			
		}else{
			//名字不为null  名字传了
			
			for(Pet pet  : pets){
				
				if(pet != null){
					String mz =pet.getName();
					
					if(name.equals(mz)){
						
						//? 说明跟 名字为null的逻辑 走同1条路
						counter = checkColorAndAge(color, age, counter, pet);
					}else{
						//不是
					}
				}
			}
		}
		
		//counter 才是新数组的长度
		Pet[]  jieguos = new Pet[counter];
		System.err.println(counter);
		
		
		//2 把符合条件的宠物放入数组中
		counter=0;
		if(name == null){
			//名字为null
			for(Pet pet: pets){
				if(pet != null){
					counter = AddPetByColorAndAge(color, age, counter, pet,jieguos,after);
				}
			}
			
		}else{
			//名字不为null  名字传了
			
			for(Pet pet  : pets){
				
				if(pet != null){
					String mz =pet.getName();
					
					if(name.equals(mz)){
						
						//? 说明跟 名字为null的逻辑 走同1条路
						counter = AddPetByColorAndAge(color, age, counter, pet,jieguos,after);
					}else{
						//不是
					}
				}
			}
		}
		
		
		
		return jieguos;
	}

	private int AddPetByColorAndAge(String color, int age, int counter, Pet pet,Pet[]  jieguos,Pet after) {
		String yanse = pet.getColor();
		//说明颜色传过来了  红色
		if(color !=null ){
			
			//颜色相等
			if(color.equals(yanse)){
				
				//判断年龄
				int nl = pet.getAge();
				//说明年龄穿过来
				if(age >0){
					if(age  == nl ){
						//找到了宠物
						changeValue(after, pet);
						jieguos[counter]=pet;
						counter++;
					}
					
				}else{
					//说明年龄穿过来 说明在条件中对年龄没有限制
					changeValue(after, pet);
					jieguos[counter]=pet;
					counter++;
				}
			}
		}else{
			//说明颜色没有传过来了  对颜色没有限制
			//判断年龄
			int nl = pet.getAge();
			//说明年龄穿过来
			if(age>0){
				if(age  == nl ){
					//找到了宠物
					changeValue(after, pet);
					jieguos[counter]=pet;
					counter++;
				}
				
			}else{
				//说明年龄穿过来 说明在条件中对年龄没有限制
				changeValue(after, pet);
				jieguos[counter]=pet;
				counter++;
			}
		}
		return counter;
	}
	
	
	private int checkColorAndAge(String color, int age, int counter, Pet pet) {
		String yanse = pet.getColor();
		//说明颜色传过来了  红色
		if(color !=null ){
			
			//颜色相等
			if(color.equals(yanse)){
				
				//判断年龄
				int nl = pet.getAge();
				//说明年龄穿过来
				if(age >0){
					if(age  == nl ){
						//找到了宠物
						return ++counter;
					}
					
				}else{
					//说明年龄穿过来 说明在条件中对年龄没有限制
					return ++counter;
				}
			}
		}else{
			//说明颜色没有传过来了  对颜色没有限制
			//判断年龄
			int nl = pet.getAge();
			//说明年龄穿过来
			if(age>0){
				if(age  == nl ){
					//找到了宠物
					return ++counter;
				}
				
			}else{
				//说明年龄穿过来 说明在条件中对年龄没有限制
				return ++counter;
			}
		}
		return counter;
	}
	
	/**
	 * 根据条件修改宠物 没有考虑批量修改的情况
	 * @huayun            宠物商店
	 * @param conditions  条件  颜色 名字 年龄的排列组合
	 * @param after       要修改后的值
	 * @return
	 */
	@Override
	public Pet updateByCondition(PetShop huayun,Pet conditions, Pet after) {
		
		//拿到所有的条件  (颜色 性别 姓名)  如果不为null 3次循环
		String name  = conditions.getName();
		String color = conditions.getColor();
		int    age   = conditions.getAge();
		
		//要查找的范围 所有的宠物
		Pet[] pets = huayun.getPets();
		
		if(name== null && color !=null  && age >0){
			
			for(Pet pet: pets){
				
				if(pet !=null){
					String yanse =pet.getColor();
					int    nianlin =pet.getAge();
					if(nianlin == age   &&  color.equals(yanse)  ){
						
						changeValue(after, pet);
						return pet;
					}
				}
			}
		}
		return null;
	}

	private void changeValue(Pet after, Pet pet) {
		String afterName= after.getName();
		if(afterName !=null ){
			//把宠物的名字修改成afterName
			pet.setName(afterName);
		}
		
		String afterColor = after.getColor();
		if(afterColor != null){
			//把宠物的颜色修改成afterColor
			pet.setColor(afterColor);
		}
		
		int afterAge =after.getAge();
		if(afterAge>0){
			//把宠物的年龄修改成afterAge
			pet.setAge(afterAge);
		}
	}
	
	

	@Override
	public boolean addPet(PetShop huayun, Pet pet) {
		
		boolean flag=false;
		
		//1 得到放置宠物的笼子
		Pet[] pets = huayun.getPets();
		
		int counter=0;
		for(int index=0; index<pets.length;index++){
			Pet chongwu = pets[index];
			if(chongwu == null){
				break;
			}else{
				counter++;
			}
		}
		
		//counter 宠物的下标
		if(counter<=pets.length-1){
			
			pets[counter]=pet;
			flag=true;
		}else{
			System.out.println("满了....");
		}
		
		
		//2 看笼子满了没有
		
		//3 把宠物放进去
		
		return flag;
		
	}

	
	/**
	 * 根据宠物的名字进行查找  如果有 直接返回这只宠物  如果没有null
	 * @param huayun
	 * @param petName
	 * @return
	 */
	@Override
	public Pet findPetByName(PetShop huayun, String petName) {
		//1 根据已知的huayun拿到宠物笼子=数组
		Pet[] pets = huayun.getPets();
		
		/*for(int index =0; index<pets.length;index++){
			Pet pet = pets[index];
		}*/
		
		for(Pet pet : pets){
			
			//拿到宠物的名字  为什么没有? 重点中的重点
			String mingzi = pet.getName();
			if(mingzi.equals(petName)){
				//找到了
				System.out.println("找到了");
				return pet;
			}
			
		}
		
		//2 遍历数组   拿到1只宠物  拿到宠物的名字 mingzi  == petName
		return null;
	}

	/**
	 * 根据宠物的年龄来查找符合要求的宠物s
	 * @param huayun  宠物商店
	 * @param age     年龄
	 * @return
	 */
	@Override
	public Pet[] findPetsByAge(PetShop huayun, int age) {
		
		Pet[] pets = huayun.getPets();
		
		Pet[] jieguo=null;
		
		int counter=0;
		//1 准备一个多大的笼子来装?
		for(int index =0; index<pets.length;index++){
			//拿到具体的某只宠物
			Pet pet = pets[index];
			
			//如果pet不是为null 才能比较
			if(pet != null){
				//拿到宠物的年龄  重点代码
				int nl = pet.getAge();
				
				if(nl == age){
					//找到了
					counter++;
				}
			}
		}
		
		//counter的值=2 等于我们要的数组的长度
		jieguo = new Pet[counter];
		
		
		counter =0;
		
		//2 遍历笼子pets 把符合条件的宠物都加进去
		for(Pet pet:pets){
			if(pet != null){
				//拿到宠物的年龄  重点代码
				int nl = pet.getAge();
				
				if(nl == age){
					//找到了 加入到新数组中去
					jieguo[counter]=pet;
					counter++;
				}
			}
			
		}
		return jieguo;
	}


	

}
